/******************************************************************************
 * Copyright (C), 2014, BeeIoT Tech. Co., Ltd. 
 * FileName:        pdu.c
 * Author:          lvxin 
 * Version :        1.0
 * Date:            2014-12-22 15:14:33
 * Description:
 * Function List:   1. -------
 * History:
 * <author>     <time>                <version >  <desc> 
 * lvxin        2014-12-22 15:14:33   1.0         build this moudle 
 *****************************************************************************/

/******************************************************************************
 *  *INCLUDES
 *  */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "object.h"
#include "pdu.h"
#include "SIM900A.h"

/******************************************************************************
 *  *MICROS
 *  */
#define     DIM(x)  (sizeof(x)/sizeof(x[0]))

/******************************************************************************
 *  *TYPEDEFS
 *  */

/******************************************************************************
 *  *FUNCTION DECLARES
 *  */
extern void pdu_handle_init(pdu_key_handle_t **handle_arr, int *handle_num, char cmd);
extern int pdu_error_handle(int info);
extern int pdu_save_options(int field_total);
extern int pdu_final(void);
//激活保存参数函数
void PDU_active_save_options_func(void);

/******************************************************************************
 *  *LOCAL VARIABLES
 *  */

static pdu_key_handle_t * l_key_handle_arr;
static int l_key_handle_num;

static char field_total = 0;

/******************************************************************************
 *  *LOCAL FUNCTIONS
 *  */

static int _pdu_parse_field_proc(char *first, char *end)
{
    int i = 0;
    int j = 0;
    char *dest = NULL; //传给下一级的地址
    int dest_len = 0; //传给下一级的数据长度
    int len = ((end-first)?(end-first):(first-end)) + 1;//文本长度

    int key_len = 0; //key长度
    int dim = l_key_handle_num;

    /*memdump (first, len * sizeof(uint16_t));*/
    for (i = 0; i < dim; i ++)
    {
        key_len = strlen(l_key_handle_arr[i].key);

        if (strstr(first, l_key_handle_arr[i].key) == first)
        {
            dest =  first + key_len;
            dest_len = len - key_len;
            /*if(dest_len != 0)*/
            {
                /*dest[dest_len] = 0;*/
                printf ("[key]%s\t[params]", l_key_handle_arr[i].key);
                for (j = 0; j < dest_len; j ++)
                {
                    putchar (dest[j]);
                }
                printf ("\n");
                
                /*return 0;*/
                field_total ++;
                return l_key_handle_arr[i].func((char *)dest, dest_len);
            }
        }
    }
    return 0;
}

/******************************************************************************
 *  *PUBLIC FUNCTIONS
 *  */

/******************************************************************************
 * Function:        pdu_parse()
 * Description:     pdu数据语法解析，并执行操作
 * Calls:           _pdu_parse_field_proc()
 * Calls:           pdu_save_options();
 * Called By:       
 * Input:           pdu --pdu_t格式的数据
 * Return:          0 --解析成功 -1 --解析失败
 * Others:          
 *****************************************************************************/
int pdu_parse(char *pdu)
{
    int i = 0;
    char last;  //上一个字符
    char *first; //字段第一个字的位置
    char *end; //字段最后一个字的位置
    int pdu_len = 0;
    char *tmp = NULL;
    char cmd_type; //指令类型0--设置  1-查询
    
    if (pdu == NULL)
    {
        return -1;
    }

    tmp = strstr(pdu, "设置");
    cmd_type = 0;
    if (tmp == NULL)
    {
        tmp = strstr(pdu, "查询");
        cmd_type = 1;
        if (tmp == NULL) return -1;
    }
    pdu = tmp;
    DBG_PRINTF("PDU:%s\n", pdu);

    pdu_handle_init (&l_key_handle_arr, &l_key_handle_num, cmd_type);

    last = pdu[0]; //第一个字
    first =(char *) pdu;  //第一个字段
    pdu_len = strlen(pdu);


    for (i = 0; i < pdu_len; i ++)
    {
        if (last == '#') //如果上一个字符是#，设置first指针
        {
            first = (char *)pdu + i;
        }
        if (pdu[i] == '#' && last != '#') //遇到分隔符
        {
            end = (char *)pdu+ i - 1; //上一个字段的最后一个字
            *(end+1) = 0;
            _pdu_parse_field_proc (first, end);
            *(end+1) = '#';
        }
        else if (i == pdu_len - 1 && *pdu + i != '#')
        {
            end = (char *)pdu + i; //最后一个字
            _pdu_parse_field_proc (first, end);
        }
        last = *(pdu+i);
    }

    if (cmd_type == 0)
        pdu_save_options(field_total); //保存设置参数
    return pdu_final(); 
}

